package JavaEEInitial.Threads.ThreadCommunication.ThreadSafe;

/**
 * 什么是线程安全
 * 线程安全：多线程环境下，程序的运行结果 ！！！！100% ！！！！符合预期。
 * 出现过符合预期的结果，能否称为线程安全 —— 不能！
 *
 * 线程安全在不同场合下的不同含义：
 * 1 形容一个程序是线程安全的：程序的运行结果是 100% 正确的
 * 2 形容一个类/对象是线程安全的：这个对象可以在多线程环境下使用
 *      数据结构阶段学习过的 ArrayList/LinkedList/PriorityQueue/TreeMap/TreeSet/HashMap/HashSet
 *      数据库阶段学习过的 Connection
 *      都不是线程安全的，即不能在多个线程之间共享同一份这些对象。
 */

/**     判断什么样的线程是线程安全的
 * 如何简单地判断一个程序是否是线程安全的
 * 1. 是否存在多个线程？如果只有一个线程，线程安全。
 * 2. 多个线程之间是否存在数据的共享？如果没有共享，线程安全。
 * 3. 是否存在至少一个线程在修改共享数据？如果都是读操作，线程安全。
 * 4. 是否正确地进行了处理？如果没有处理，线程不安全。
 */
public class ThreadSafe {
    /**
     * 线程安全下的 3 个点*
     *  1.原子性（Atomic）：//1.a++;    不可再分的 2.Check-update;  不可再分的 //
     *                   原子性被破坏，必然出现线程安全问题。
     *  2.内存的可见性（Memory Visible）
     *  3.代码重排序（Reordering）：为什么要进行重排序，很重要的一个原因就是要优化。
     *                           编译器、JVM（JIT）、CPU 都是可能做指令优化。
     * 基本底线：JVM 标准规定，无论如何进行重排序，在单一线程下需要逻辑等价，即结果不能变。即意味着在多线程环境下，可能因为指令重排序导致程序执行出错。
     */

}
